home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / sound / rukq10.zip / X03.BAS < prev   
BASIC Source File  |  1993-02-15  |  7KB  |  245 lines

  1. DECLARE FUNCTION InitDevice% (device%, SIP AS ANY, IP AS ANY)
  2. DECLARE FUNCTION PickDevice% (SIP AS ANY, XMSflag%)
  3.  
  4. REM $INCLUDE: 'RUCKDAC.BI'
  5.  
  6. '--------------------------------------
  7. 'SEE X03_71.BAS FOR BASIC 7.1 AND VBDOS
  8. '--------------------------------------
  9.  
  10. 'X03.BAS - record digital data and playback
  11. '
  12. '31-Jan-93 -chh
  13. 'C>bc X03 /o;
  14. 'C>link X03,X03.EXE,nul,RUCKDAC.LIB;
  15. ver$ = "[930131]"
  16.  
  17. DEFINT A-Z
  18.  
  19. 'The packs could be made global but passing them as paramters works
  20.  
  21. DIM SIP AS SysInfoPackTYPE
  22. DIM IP AS InitPackTYPE
  23. DIM LP AS LoadPackTYPE
  24. DIM SP AS SetPackTYPE
  25. DIM SPP AS SetProPackTYPE
  26. DIM PBP AS PlaybackPackTYPE
  27. DIM RP AS RecordPackTYPE
  28. DIM GDP AS GetDataPackTYPE
  29. DIM DP AS DeallocPackTYPE
  30. DIM XP AS XitPackTYPE
  31.  
  32. CLS
  33. PRINT "X03.BAS - RUCKUS-DAC record and save of a digital file example."; ver$
  34.  
  35. InIDE = -1     'since the IDE needs more than 2K available, use this to
  36.                'flag if operating in QB's ennvironment
  37.  
  38. 'RUCKDAC uses memory from the operating system pool
  39. 'since BASIC starts up claiming all memory, instruct it to return excess
  40. 'memory back to OS pool
  41.  
  42. nix& = SETMEM(700000)           'return to QB environment any previous release
  43. nix& = SETMEM(0)                'see how much is available
  44. nix& = nix& - 2100              'release all but 2K to operating system
  45.  
  46. IF InIDE THEN
  47.    nix& = nix& - 66000          'leave 64K more for IDE
  48.    XP.Func = ExitDac            'and shut down any loose ends
  49.    nix = RUCKDAC(XP)
  50. END IF
  51.  
  52. nix& = SETMEM(-nix&)            'this call does the actual release
  53.  
  54. 'pick device to use
  55.  
  56. devID = PickDevice(SIP, XMSflag)'id system and get device to use
  57. IF devID < 0 THEN PRINT "Ended.": END
  58.  
  59. CLS
  60. LOCATE 5
  61.  
  62. 'initialize the selected device and register ExitDac via AtExitDac
  63.  
  64. stat = InitDevice(devID, SIP, IP)
  65. IF stat = 0 THEN
  66.    
  67.    'see how much memory is available to record in
  68.  
  69.    DEF SEG = IP.InfoPtrSeg
  70.    bp = IP.InfoPtrOff
  71.  
  72.    DOSleftK = 256 * PEEK(bp + 17) + PEEK(bp + 16)
  73.    XMSleftK = 256 * PEEK(bp + 19) + PEEK(bp + 18)
  74.  
  75.    RecSeconds = 5
  76.    RecRate = 12000
  77.  
  78.    'select source input
  79.  
  80.    SPP.Func = SetSourceSBP
  81.    SPP.SourceIn = 0     'mic
  82.    stat = RUCKDAC(SPP)
  83.  
  84.    PRINT "   Device ID:"; devID
  85.    PRINT " Record from: Mic"
  86.    PRINT " Record time:"; RecSeconds; "secs"
  87.    PRINT " Record rate:"; RecRate; "Hz"
  88.  
  89.    IF XMSflag = 0 THEN
  90.       PRINT " Memory type: DOS"
  91.       PRINT "K bytes left:"; DOSleftK
  92.    ELSE
  93.       PRINT " Memory type: XMS"
  94.       PRINT "K bytes left:"; XMSleftK
  95.    END IF
  96.    PRINT
  97.  
  98.    'prepare for record (5 seconds at 12000 Hz sample rate)
  99.  
  100.    RP.Func = RecordDac
  101.    RP.SampleRate = RecRate
  102.    RP.XMMhandle = XMSflag   'if -1 auto-alloc an XMS handle else use DOS
  103.    RP.RecordPtrOff = 0
  104.    RP.RecordPtrSeg = 0
  105.    RP.RecordBytes = 1& * RecSeconds * RecRate
  106.    RP.StereoFlag = 0        'recording from mic is mono
  107.  
  108.    INPUT "Press Enter to begin 5-second record...", a$
  109.  
  110.    stat = RUCKDAC(RP)
  111.  
  112.    'wait until the 5-second recording is done
  113.  
  114.    DO
  115.       DacIsDone = PEEK(bp + 10)
  116.    LOOP UNTIL DacIsDone
  117.  
  118.    INPUT "Press Enter to playback recording", a$
  119.  
  120.    PBP.Func = PlayDac
  121.    PBP.Mode = 2
  122.    IF XMSflag = 0 THEN
  123.       PBP.XMMhandle = 0
  124.       PBP.LoadPtrOff = RP.RecordPtrOff
  125.       PBP.LoadPtrSeg = RP.RecordPtrSeg
  126.    ELSE
  127.       PBP.XMMhandle = RP.XMMhandle
  128.       PBP.LoadPtrOff = 0
  129.       PBP.LoadPtrSeg = 0
  130.    END IF
  131.    stat = RUCKDAC(PBP)
  132.  
  133.    DO
  134.       DacIsDone = PEEK(bp + 10)
  135.    LOOP UNTIL DacIsDone
  136.    DEF SEG
  137.  
  138.    'end play
  139.  
  140.    XP.Func = EndDac
  141.    stat = RUCKDAC(XP)
  142.  
  143.    'release memory used by RecordDac (ExitDac would do that, too)
  144.  
  145.    DP.Func = DeallocDac
  146.    IF XMSflag = 0 THEN
  147.       DP.HandSeg = RP.RecordPtrSeg
  148.       DP.TypeFlag = 0
  149.    ELSE
  150.       DP.HandSeg = RP.XMMhandle
  151.       DP.TypeFlag = 1
  152.    END IF
  153.    stat = RUCKDAC(DP)
  154.  
  155. ELSE
  156.    PRINT "InitDevice failed, stat:"; stat
  157. END IF
  158.  
  159. 'shut down RUCKDAC and end program
  160.  
  161. XP.Func = ExitDac
  162. nix = RUCKDAC(XP)
  163. PRINT "  Done, stat:"; stat
  164. nix& = SETMEM(700000)   'return to QB environment any previous release
  165. END
  166.  
  167. FUNCTION InitDevice (device, SIP AS SysInfoPackTYPE, IP AS InitPackTYPE)
  168.  
  169. 'Initialize RUCKDAC and device and register ExitDac with _atexit
  170. 'The IP.port for devices 0 and 3 are set to 0 for low-rez mode, or their
  171. 'repective actual ports for hi-rez mode (&H42 and &H388)
  172.  
  173. DIM XP AS XitPackTYPE   'local use for AtExitDac
  174.  
  175. IP.Func = InitDac
  176. IP.DeviceID = device
  177. SELECT CASE device
  178. CASE 0: IP.IOport = 0:          IP.IRQline = SIP.D0IRQ: IP.DMAch = SIP.D0DMA
  179. CASE 1: IP.IOport = SIP.D1port: IP.IRQline = SIP.D1IRQ: IP.DMAch = SIP.D1DMA
  180. CASE 2: IP.IOport = SIP.D2port: IP.IRQline = SIP.D2IRQ: IP.DMAch = SIP.D2DMA
  181. CASE 3: IP.IOport = 0:          IP.IRQline = SIP.D3IRQ: IP.DMAch = SIP.D3DMA
  182. CASE 4: IP.IOport = SIP.D4port: IP.IRQline = SIP.D4IRQ: IP.DMAch = SIP.D4DMA
  183. CASE 5: IP.IOport = SIP.D5port: IP.IRQline = SIP.D5IRQ: IP.DMAch = SIP.D5DMA
  184. END SELECT
  185. stat = RUCKDAC(IP)
  186.  
  187. IF stat = 0 THEN
  188.  
  189.    'register ExitDac and notify if failure occured, non-fatal and unlikely
  190.  
  191.    XP.Func = AtExitDac
  192.    stat2 = RUCKDAC(XP)
  193.    IF stat2 THEN INPUT "AtExitDac failed, press ENTER to continue", a$
  194. END IF
  195.  
  196. InitDevice = stat
  197.  
  198. END FUNCTION
  199.  
  200. FUNCTION PickDevice (SIP AS SysInfoPackTYPE, XMSflag)
  201.  
  202. 'RUCKDAC SysInfoDac lib routine called to find available devices
  203. 'user prompted which device to use (0-5), -1 means no valid selection
  204. 'if XMSflag = 1 on return, user selected XMS for save of record
  205.  
  206. DIM device AS INTEGER
  207.  
  208. device = -1
  209. XMSflag = 0
  210.  
  211. SIP.Func = SysInfoDac
  212. stat = RUCKDAC(SIP)
  213. IF stat = 0 THEN
  214.  
  215.    'list devices that are available
  216.    PRINT
  217.    PRINT "0. End program"
  218.    IF SIP.Device4 THEN PRINT "5. Sound Blaster, port "; HEX$(SIP.D4port); "h, IRQ"; SIP.D4IRQ; "and DMA 1"
  219.    IF SIP.Device5 THEN PRINT "6. Sound Blaster Pro, port "; HEX$(SIP.D5port); "h, IRQ"; SIP.D5IRQ; "and DMA"; SIP.D5DMA
  220.    PRINT
  221.    IF SIP.Device4 THEN PRINT "7. Sound Blaster as 5 but use XMS (if applicable)"
  222.    IF SIP.Device5 THEN PRINT "8. Sound Blaster Pro as 6 but use XMS (if applicable)"
  223.  
  224.    PRINT
  225.    INPUT "Selection: ", device
  226.    device = device - 1
  227.  
  228.    'ensure device selected is available
  229.  
  230.    SELECT CASE device
  231.    CASE 4: IF SIP.Device4 = 0 THEN device = -1
  232.    CASE 5: IF SIP.Device5 = 0 THEN device = -1
  233.    CASE 6: IF SIP.Device4 = 0 THEN device = -1 ELSE device = 4: XMSflag = -1
  234.    CASE 7: IF SIP.Device5 = 0 THEN device = -1 ELSE device = 5: XMSflag = -1
  235.    CASE ELSE
  236.       device = -1
  237.    END SELECT
  238.  
  239. END IF
  240.  
  241. PickDevice = device
  242.  
  243. END FUNCTION
  244.  
  245.